#include "widget.h"
#include "ui_widget.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QNetworkReply>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //创建垂直布局管理器
    QVBoxLayout *vlayout=new QVBoxLayout(this);
    //创建控件
    plain_text=new QPlainTextEdit();
    //创建水平布局管理器
    QHBoxLayout *hlayout=new QHBoxLayout();
    //创建控件
    line_edit=new QLineEdit(this);
    line_edit->setPlaceholderText("请输入网址");
    button=new QPushButton();
    button->setText("发送");
    //添加到水平布局管理器中
    hlayout->addWidget(line_edit,4);
    hlayout->addWidget(button,1);
    //添加对垂直布局管理器中
    vlayout->addWidget(plain_text);
    vlayout->addLayout(hlayout);
    //显示垂直布局管理器
    this->setLayout(vlayout);

    //创建QNetworkAccessManager对象
    manager=new QNetworkAccessManager(this);
    //点击发送按钮的槽函数
    connect(button,&QPushButton::clicked,this,&Widget::handler);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::handler()
{
    //1、获取输入框中的url,并构建出QUrl对象
    QUrl url(line_edit->text());
    //2、构建一个HTTP请求对象
    QNetworkRequest request(url);
    //3、发送请求
    QNetworkReply *response=manager->get(request);
    /* get方法本身不是阻塞函数，get只是负责将请求发送出去，不负责等待响应
     * 当响应到来时，会触发finished信号，此时就可以借助信号槽机制，对接收到的完整的响应进行处理
     */
    //4、当收到一个响应信息时,通过信号槽来处理响应
    connect(response,&QNetworkReply::finished,this,[=](){
        //检测此HTTP响应是否存在问题
        if(response->error()==QNetworkReply::NoError)
        {
            //响应正确获取到了
            //将响应结果设置到QPlainTextEdit中
            //读取响应中所有内容
            QString html=response->readAll();
            //将响应内容显示到QPlainTextEdit中
            plain_text->setPlainText(html);
        }
        else
        {
            //响应出错了，将错误信息显示到QPlainTextEdit中
            //response->errorString()：获取详细的错误信息
            plain_text->setPlainText(response->errorString());
        }
        //释放response响应对象
        response->deleteLater();
    });
}

